#include <string>
#include <iostream>
#include "Heap.h"
#include "FileHandler.h"
using namespace std;

// Função de comparação:
int comparar_strings(const void* a, const void* b)
{
    return((*(string*)a).compare(*(string*)b));
}

// Função de impressão:
void imprimir(const string v[], size_t n)
{
    for (size_t i=0; i<n; i++) cout<<v[i]<<endl;//"\t";
    cout<<endl;
}

// Trocar extensao de .in para .out:
string saida_extensao(const char* entrada)
{
    const char extensao[] = ".out";
    string saida(entrada);
    size_t ponto = saida.find_last_of(".");
    if (ponto == size_t(-1)) saida.append(extensao);
    else saida.replace(ponto,ponto,extensao);
    return(saida);
}

int main(int argc, char* argv[])
{
    // Checar se foi passado algum arquivo de entrada por parâmetro:
    if (argc == 0) return(1);
    if (argc == 1)
    {
        cout<<"***************"<<endl;
        cout<<"* MODO DE USO *"<<endl;
        cout<<"***************"<<endl;
        cout<<argv[0]<<" \"arquivo1.in\" \"arquivo2.in\" \"arquivo3.in\" (...)"<<endl;
        return(1);
    }

    // Executar o procedimento para cada arquivo de entrada:
    FileHandler fh;
    string arquivo_saida;
    string* ordenado=NULL;
    size_t tamanho=0;
    for (int i=1 ; i<argc ; i++)
    {
        cout<<"*** Arquivo: "<<argv[i]<<" ***"<<endl;
        // Checar se é possível ler o arquivo de entrada:
        if(!fh.ler(argv[i])) return(1);
        // Criar o heap com as strings lidas do arquivo de entrada:
        Heap H(fh.get_texto(),fh.get_tamanho(),sizeof(string),comparar_strings);
        // Ordenar o heap:
        ordenado = (string*)H.heapsort();
        tamanho = H.tamanho();
        // Imprimir as strings ordenadas:
        imprimir(ordenado,tamanho);
        // Salvar as strings ordenadas no arquivo de saída:
        arquivo_saida = saida_extensao(argv[i]);
        if(!fh.escrever(arquivo_saida.c_str(),ordenado,tamanho)) return(1);
    }

    return(0);
}
